package cn.mldn.eshop.dataaggr.rabbitmq;

import com.alibaba.fastjson.JSONObject;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
@RabbitListener(queues = "refresh-aggr-data-change-queue")
public class RefreshAggrDataChangeQueueReceiver {
    @Resource
    private RedisTemplate<String,String> redisTemplate ;
    @RabbitHandler
    public void process(String message) {
        JSONObject messageJSONObject = JSONObject.parseObject(message);

        String dimType = messageJSONObject.getString("dim_type");

        if("brand".equals(dimType)) {
            processBrandDimDataChange(messageJSONObject);
        } else if("category".equals(dimType)) {
            processCategoryDimDataChange(messageJSONObject);
        } else if("product_intro".equals(dimType)) {
            processProductIntroDimDataChange(messageJSONObject);
        } else if("product".equals(dimType)) {
            processProductDimDataChange(messageJSONObject);
        }
    }
    private void processBrandDimDataChange(JSONObject messageJSONObject){
        long id = messageJSONObject.getLong("id") ;
        String dataJson = this.redisTemplate.opsForValue().get("brand_"+id) ;
        if(dataJson!=null&&!dataJson.equals("")){
            this.redisTemplate.opsForValue().set("dim_brand_"+id,dataJson);
        }
        else{
            this.redisTemplate.delete("dim_brand_"+id);
        }
    }
    private void processCategoryDimDataChange(JSONObject messageJSONObject) {
        Long id = messageJSONObject.getLong("id");



        // 多此一举，看一下，查出来一个品牌数据，然后直接就原样写redis
        // 实际上是这样子的，我们这里是简化了数据结构和业务，实际上任何一个维度数据都不可能只有一个原子数据
        // 品牌数据，肯定是结构多变的，结构比较复杂，有很多不同的表，不同的原子数据
        // 实际上这里肯定是要将一个品牌对应的多个原子数据都从redis查询出来，然后聚合之后写入redis
        String dataJSON = this.redisTemplate.opsForValue().get("category_" + id);

        if(dataJSON != null && !"".equals(dataJSON)) {
            this.redisTemplate.opsForValue().set("dim_category_" + id, dataJSON);
        } else {
            this.redisTemplate.delete("dim_category_" + id);
        }
    }

    private void processProductIntroDimDataChange(JSONObject messageJSONObject) {
        Long id = messageJSONObject.getLong("id");
        String dataJSON = this.redisTemplate.opsForValue().get("product_intro_" + id);

        if(dataJSON != null && !"".equals(dataJSON)) {
            this.redisTemplate.opsForValue().set("dim_product_intro_" + id, dataJSON);
        } else {
            this.redisTemplate.delete("dim_product_intro_" + id);
        }
    }
    private void processProductDimDataChange(JSONObject messageJSONObject){
        long id = messageJSONObject.getLong("id") ;
        String productDataJSON = this.redisTemplate.opsForValue().get("product_"+id) ;
        if(productDataJSON!=null&&!productDataJSON.equals("")){
            JSONObject productDataJSONObject = JSONObject.parseObject(productDataJSON) ;
            String productPropertyjSON = this.redisTemplate.opsForValue().get("product_property_"+id) ;
            if(productPropertyjSON!=null&&!productPropertyjSON.equals("")){
                productDataJSONObject.put("product_property",JSONObject.parseObject(productPropertyjSON)) ;
            }
            String productSpecificationJson = this.redisTemplate.opsForValue().get("product_specification_"+id) ;
            if (productSpecificationJson!=null&&!productSpecificationJson.equals("")){
                productDataJSONObject.put("product_specification",JSONObject.parseObject(productSpecificationJson)) ;
            }

            this.redisTemplate.opsForValue().set("dim_product_" + id,productDataJSONObject.toJSONString());
        }
        else{
            this.redisTemplate.delete("dim_product_"+id);
        }
    }
}
